iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
DevOps

第一次參賽就學 Kubernetes系列 第 26

[Day 26] Authentication - Role Based Access Control (RBAC)

  • 分享至 

  • xImage
  •  

在 RBAC 中有 4 個物件:

  1. Role
  2. RoleBinding
  3. ClusterRole
  4. ClusterRoleBinding

Role & Rolebindings

在 default 的 namespace 下建立 role,一個 role 可以有多個 rules

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: developer
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "list", "create", "update", "delete"]
- apiGroups: [""]
  resources: ["deployments"]
  verbs: ["get", "list", "update"]
  resourceNames: ["new-deployment"] # 限制名稱為 new-deployment 的 deployment
  • apiVersion:RBAC 使用的 api version 為 rbac.authorization.k8s.io/v1
  • namespace:指的是在 namespace 為 default 的該資源
  • apiGroups:空白指 core API group,或指定 group 名稱,如 example.com
  • resource:授權的資源,如 pods、deployments 或 jobs,* 表示所有資源
  • verbs:可對資源進行何種操作,如 create (kubectl create -f pods.yaml) 取得 pods 資訊

透過 rolebinding 將 user 連接 role。以下是 user-1developer 的權限,在 default namespace 中進行 get pod、list、create 等操作,及可對 deployments 執行 get、list、update 動作。

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: default
  name: dev-user-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: developer
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: user-1
  • namespace:default
  • roleRef
    • kindRoleClusterRole
    • name:要 binding 的物件名稱
  • subjects:可以有一個或多個 users
    • name:名稱有分大小寫

建立 role。

kubectl create -f dev-role.yaml

建立 roleBinding。

kubectl create -f dev-role-binding.yaml

另一種方式是透過以下指令建立 roleBinding。

kubectl create rolebinding dev-user-binding --role=developer --user=user-1

檢查自己有沒有被指定到該 role。

kubectl auth can-i list deployments --as developer

或是檢查其他 user 則使用以下指令。

kubectl list deployments --as user-1

ClusterRole & ClusterRolebindings

對 node 來說不會僅限於某 namespace 中,node 是在叢集中存取(cluster-scope)的。也就是說資源可以分為以 namespace 存取、不能以 namespace 劃分(叢集範圍)存取兩種。

叢集範圍類別的資源包含:node、persistent volume、namespace、clusterroles 與 clsuterrolebindings 等。

若要查看 k8s 的資源可以透過 kubectl api-resources 指令,會標示資源的 namespacetruefalse

而 clusterRole 與 clusterRolebindings 就是賦予 user 叢集範圍資源的權限。

  1. 建立 clusterRole,賦予該角色 get、watch 和 list secret 的操作權限。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

或是透過以下指令。

kubectl create clusterrole secret-reader --resource=secrets --verb=get,watch,list
  1. 建立 clusterRoleBinding,將 ClusterRole 連接到 manager 群組,使該群組可以讀取任何 namespace 下的 secrets。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: secrets-user-cluster-role-binding
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
  name: manager
  apiGroup: rbac.authorization.k8s.io

或是透過以下指令。

kubectl create clusterrolebinding secrets-user-cluster-role-binding --clusterrole=secret-reader --user=manager

檢查有沒有設定成功。

kubectl get secrets --as manager

ClusterRole & Rolebinding

ClusterRole 也可以與 rolebinding 一起使用,因 rolebinding 是可以限制在某 namespace 中,故會變成該 namespace 下的 user 可以擁有叢集範圍資源的存取權限。


參考來源

  1. Certified Kubernetes Administrator (CKA) with Practice Tests

上一篇
[Day 25] Authentication
下一篇
[Day 27] Namespaces
系列文
第一次參賽就學 Kubernetes30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言